home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / radiance / simplerd.lha / simplerad / FinalFTP / WalkT / window.c < prev   
Encoding:
C/C++ Source or Header  |  1992-07-20  |  10.8 KB  |  366 lines

  1. /**********************************************************************/
  2. /* window.c                                                           */
  3. /*                                                                    */
  4. /* Window handling routines                                           */
  5. /*                                                                    */
  6. /* Copyright (C) 1992, Bernard Kwok                                   */
  7. /* All rights reserved.                                               */
  8. /* Revision 1.0                                                       */
  9. /* May, 1992                                                          */
  10. /**********************************************************************/
  11. #include <stdio.h>
  12. #include <math.h>
  13. #include <fmclient.h>
  14. #include <gl/gl.h>
  15. #include <gl/device.h>
  16. #include <errno.h>
  17. #define IRIS4D 1
  18. #include "geo.h"
  19. #include "walk.h"
  20. #include "vcr.h"
  21.  
  22. /* Mouse button down status */
  23. int WindLeftDown = 0;
  24. int WindMiddleDown = 0;
  25. int WindRightDown = 0;
  26.  
  27. /**********************************************************************/
  28. /* Reset mouse button down status                                     */
  29. /**********************************************************************/
  30. void ResetMouseDown()
  31. { WindLeftDown = WindMiddleDown = WindRightDown = 0; }
  32.  
  33. /**********************************************************************/
  34. /* Handle main window events. Keep track of mouse movement and        */
  35. /* buttons pressed                                                    */
  36. /**********************************************************************/
  37. void DoEventsWind(dev, val)
  38.   long dev;
  39.   short val;
  40. {
  41.   winset(WindWid);
  42.   switch(dev) {
  43.  
  44.   case RIGHTMOUSE : /* On down mouse down */
  45.     if (val) {
  46.       if (!WindLeftDown && !WindMiddleDown) {
  47.     BuildMainMenu();                      /* Menu on right down */
  48.     dopup(Menu);
  49.       } else {
  50.     WindRightDown = 1;
  51.     view.om.x = getvaluator(MOUSEX) - WindXorigin;
  52.     view.om.y = getvaluator(MOUSEY) - WindYorigin;
  53.       }      
  54.     } else 
  55.       WindRightDown = 0;
  56.     break;
  57.  
  58.   case LEFTMOUSE :                           
  59.     if (val) {
  60.       WindLeftDown = 1;
  61.       view.om.x = getvaluator(MOUSEX) - WindXorigin;
  62.       view.om.y = getvaluator(MOUSEY) - WindYorigin;
  63.     } else 
  64.       WindLeftDown = 0;
  65.     break;
  66.     
  67.   case MIDDLEMOUSE :                         
  68.     if (val) {
  69.       WindMiddleDown = 1;
  70.       view.om.x = getvaluator(MOUSEX) - WindXorigin;
  71.       view.om.x = getvaluator(MOUSEY) - WindYorigin;
  72.     } else
  73.       WindMiddleDown = 0;
  74.     break;
  75.  
  76.   case REDRAW:
  77.     if (Option.debug) printf("Redrawing window\n");
  78.     reshapeviewport();
  79.     getorigin((int)&WindXorigin, (int)&WindYorigin);
  80.     WindLeftDown = WindRightDown = WindMiddleDown = 0;
  81.     reshapeviewport();
  82.     Draw_Scene();
  83.     break;
  84.   }
  85. }
  86.  
  87. /**********************************************************************/
  88. /* Do events in main window                                           */
  89. /**********************************************************************/
  90. void DoWind()
  91. {
  92.   int moved = 0;
  93.   winset(WindWid);
  94.  
  95.   if (Option.debug)
  96.     if (WindMiddleDown || WindRightDown || WindLeftDown) {
  97.       printf("Buttons pressed are: %d %d %d\n", WindLeftDown, 
  98.          WindMiddleDown, WindRightDown);
  99.     }
  100.   /* Current x,y position */
  101.   view.m.x = getvaluator(MOUSEX) - WindXorigin;
  102.   view.m.y = getvaluator(MOUSEY) - WindYorigin;
  103.  
  104.   if (WindLeftDown && !WindMiddleDown && WindRightDown) {
  105.     Option.mode = ORIENT_ZOOM;      /* Right + left = Zoom */
  106.     moved = 1;
  107.   }
  108.   else if (WindLeftDown && WindMiddleDown && WindRightDown) {
  109.     Option.mode = ORIENT_SCALE;     /* All buttons = Scale */
  110.     moved = 1;
  111.   }
  112.   else if (WindLeftDown && !WindMiddleDown && !WindRightDown) {
  113.     Option.mode = ORIENT_ROT;       /* Left button = Rotate in x,z */
  114.     moved = 1;
  115.   }
  116.   else if (!WindLeftDown && WindMiddleDown && !WindRightDown) {
  117.     Option.mode = ORIENT_SPIN;     /* Middle button = Rotate in y */
  118.     moved = 1;
  119.   }
  120.   else if (WindLeftDown && WindMiddleDown && !WindRightDown) {
  121.     Option.mode = ORIENT_TRANSL;    /* Not middle button = translate */
  122.     moved = 1;
  123.   }
  124.  
  125.   /* Update scene depending on movement */
  126.   if (moved) {
  127.     if (Option.debug) 
  128.       printf("Moved with movement mode: %d\n", Option.mode);
  129.     Update_Scene();
  130.     moved = 0;
  131.   }
  132.  
  133.   /* Store current as old position */
  134.   view.om.x = view.m.x;
  135.   view.om.y = view.m.y;
  136. }
  137.   
  138. /**********************************************************************/
  139. /* Handle panel events                                                */
  140. /**********************************************************************/
  141. void DoEventsPanel(dev, val)
  142.      long dev;
  143.      short val;
  144. { printf("Panel not set up yet\n"); }
  145.  
  146. /**********************************************************************/
  147. /* Handle all program events                                          */
  148. /**********************************************************************/
  149. void HandleEvents()
  150. {
  151.   int done = 0;
  152.   long dev;
  153.   short val;
  154.   short wind_infocus = 0;
  155.   short panel_infocus = 0;
  156.   short help_infocus = 0;
  157.  
  158.   while(!done) {
  159.     if ((!WindLeftDown && !WindRightDown && !WindMiddleDown) || qtest()) {
  160.       switch(dev = qread(&val)) {
  161.       
  162.       case ESCKEY:
  163.     if (val) break; 
  164.     done = TRUE;
  165.     
  166.       case INPUTCHANGE:  /* Switch to appropriate window */
  167.     wind_infocus = (val == WindWid);
  168.     panel_infocus = (val == PanelWid);
  169.     help_infocus = (val == HelpWid);
  170.     break;
  171.     
  172.       case REDRAW: /* Redraw appropriate window */
  173.     if (val == WindWid)
  174.       DoEventsWind(dev, val);
  175.     else if (val == HelpWid) DoEventsHelp(dev, val); 
  176.     else if (val == PanelWid) DoEventsPanel(dev, val);
  177.     break;
  178.     
  179.       default: /* Send device id and device value to approp. window */
  180.     if (wind_infocus)
  181.       DoEventsWind(dev, val);
  182.     else if (help_infocus)
  183.       DoEventsHelp(dev,val);
  184.     else if (System.UsePanel && panel_infocus) 
  185.       DoEventsPanel(dev, val);
  186.       }
  187.     }
  188.     
  189.     /* Handle geometry changes */
  190.     if (wind_infocus) DoWind(); 
  191.   }
  192.   
  193.   if (System.UseVCR)           /* Stop the video */
  194.     vcr_end_video();
  195. }
  196.  
  197. /**********************************************************************/
  198. /* Initialize fonts 5,8 and 10 pt                                     */
  199. /**********************************************************************/
  200. void InitFonts()
  201. {
  202.   fminit();
  203.   
  204.   FontScreen = fmfindfont("Screen");
  205.   FontScreen5 = fmscalefont(FontScreen, 5.0);
  206.   FontScreen8 = fmscalefont(FontScreen, 8.0);
  207.   FontScreen10 = fmscalefont(FontScreen, 10.0);
  208.   
  209.   fmgetfontinfo(FontScreen, &FontScreenInfo);
  210.   fmgetfontinfo(FontScreen5, &FontScreen5Info);
  211.   fmgetfontinfo(FontScreen8, &FontScreen8Info);
  212.   fmgetfontinfo(FontScreen10, &FontScreen10Info); 
  213. }
  214.  
  215. float clut_gamma = 2.20;
  216. short gamma_rgb[256];
  217. /**********************************************************************/
  218. /* Load colour map for gamma correction */
  219. /**********************************************************************/
  220. void SetGamma()
  221. {
  222.   int i;
  223.   
  224.   /* Loop through all 256 values a color lookup table would have */
  225.   for (i = 0; i < 256; i++) {
  226.     gamma_rgb[i] = 
  227.       (int)(255.0 * pow((double) i / 255.0, 1.0 / clut_gamma));
  228.     /* if (i % 16 == 0)
  229.        printf("\n");
  230.        printf("%d ", gamma_rgb[i]); */
  231.   }
  232.   gammaramp(gamma_rgb, gamma_rgb, gamma_rgb);
  233. }
  234.  
  235. /*********************************************************************/
  236. /* Open a new geometry window                                        */
  237. /*********************************************************************/
  238. int OpenNewWindow(Wname, xsize, ysize, xorigin, yorigin) 
  239.      char *Wname;
  240.      int xsize, ysize, xorigin, yorigin;
  241. {
  242.   int newWid;
  243.  
  244.   if (System.UseVCR) {            /* Use VCR */
  245.     vcr_setup_window(FALSE);
  246.  
  247.   } else if (System.FullScreen) {
  248.     prefsize(XMAXSCREEN, YMAXSCREEN);
  249.     /* prefposition(0,0,XMAXSCREEN-1,YMAXSCREEN-1); */
  250.     noborder();
  251.  
  252.   } else {
  253.     if (System.UsePrefsize)       /* Check to use prefered size or */
  254.       prefsize(xsize, ysize);     /* position */
  255.     if (System.UsePrefpos)
  256.       prefposition(xorigin, xorigin + xsize -1,
  257.            yorigin, yorigin + ysize -1);
  258.   }
  259.  
  260.   if ((newWid = winopen(Wname)) == -1) {
  261.     fprintf(stderr, "No more windows available\n");
  262.     return -1;
  263.   }
  264.  
  265.   if (System.UseDoubleBuf) 
  266.     doublebuffer();            /* Use doublebuffering */
  267.   if (System.UseRGB) {
  268.     RGBmode();                 /* Use RGB mode */    
  269.     if (System.gamma)          /* Set gamma correction */
  270.       SetGamma();
  271.   }
  272.   mmode(MVIEWING);
  273.   gconfig();
  274.   getorigin(&xorigin, &yorigin);
  275.   getsize(&xsize, &ysize);
  276.  
  277.   if (System.UseZBuf)           /* Use z-buffer */
  278.     zbuffer(TRUE);              
  279.   glcompat(GLC_ZRANGEMAP, 0);   /* Set map */
  280.   System.zfar =                 /* Find max z for zbuffering */
  281.     getgdesc(GD_ZMAX);
  282.  
  283.   /* if (System.UseAccBuf) {   Using accumulation buffer (not used) 
  284.      subpixel(TRUE);
  285.      InitAccBuff(newWid, 64);
  286.      InitKernals();
  287.      SetKernalId(); 
  288.      } */
  289.  
  290.   if (System.UseVCR) {          /* Set view parameters */
  291.     vcr_start_video();
  292.   }
  293.   return newWid;
  294. }
  295.  
  296. /**********************************************************************/
  297. /* Initialize graphics                                                */
  298. /**********************************************************************/
  299. void InitGraphics()
  300. {
  301.   /* Check for z and bit-planes */
  302.   if (System.UseDoubleBuf) 
  303.     if  (getgdesc(GD_BITS_NORM_DBL_RED) == 0) {
  304.       fprintf(stderr, "Double buffered RGB not available on this machine\n");
  305.       exit(1); 
  306.     }
  307.   if (System.UseZBuf)
  308.     if (getgdesc(GD_BITS_NORM_ZBUFFER) == 0) {
  309.       fprintf(stderr, "Z buffer not available on this machine\n");
  310.       exit(1);
  311.     }
  312.   if (System.UseAccBuf) 
  313.     if (getgdesc(GD_BITS_ACBUF) == 0) {
  314.       fprintf(stderr, "Accumlation buffer not available on this machine\n");
  315.       exit(1);
  316.     }
  317.   if (System.UseVCR) {
  318.     vcr_set_mode(System.VCRmode);
  319.   }
  320.   
  321.   /* Get/set screen size/aspect */
  322.   System.xscrnsize = getgdesc(GD_XPMAX);  
  323.   if (System.xscrnsize == 1280) {
  324.     keepaspect(5, 4);
  325.     System.scrnaspect = 1.25;
  326.   } else if (System.xscrnsize == 1024) {
  327.     keepaspect(4, 3);
  328.     System.scrnaspect = 1.34;
  329.   } else {
  330.     fprintf(stderr, "Something's extremely wrong:  ");
  331.     fprintf(stderr, "Screen size in x=%d\n", System.xscrnsize);
  332.     exit(-1) ;
  333.   }
  334.  
  335.   WindWid = OpenNewWindow(WindowName, WindXsize, WindYsize, 
  336.               WindXorigin, WindYorigin);
  337.   
  338.   System.GraphInitialized = 1;
  339. }
  340.  
  341. /**********************************************************************/
  342. /* Initialize queue devices and reset queue */
  343. /**********************************************************************/
  344. void InitQueue()
  345. {
  346.   qdevice(ESCKEY);
  347.   qdevice(LEFTMOUSE);
  348.   qdevice(MIDDLEMOUSE);
  349.   qdevice(RIGHTMOUSE); 
  350.   qdevice(INPUTCHANGE); 
  351.   qdevice(REDRAW);
  352.   qreset();
  353. }
  354.  
  355. /**********************************************************************/
  356. /* Exit the program */
  357. /**********************************************************************/
  358. void DoExit(rc)
  359.     int rc;
  360. {
  361.   if (System.GraphInitialized) 
  362.     gexit();
  363.   exit(rc);
  364. }
  365.  
  366.